import { NextRequest, NextResponse } from 'next/server';
import UserModel, { UserLoginData } from '@/models/user';
import { comparePassword, generateToken } from '@/utils/auth';

export async function POST(request: NextRequest) {
  console.log('=== 登录API请求开始处理 ===');
  console.log('请求方法:', request.method);
  console.log('请求URL:', request.url);
  console.log('请求头:', JSON.stringify(Object.fromEntries(request.headers.entries())));

  try {
    // 解析请求体
    let body;
    try {
      const bodyText = await request.text();
      console.log('原始请求体:', bodyText);
      body = JSON.parse(bodyText);
      console.log('解析后的请求体:', body);
    } catch (parseError) {
      console.error('解析请求体失败:', parseError);
      return NextResponse.json(
        { error: '无法解析请求体' },
        { status: 400 }
      );
    }

    const { username, password } = body as UserLoginData;

    console.log(`尝试登录用户: ${username}, 密码长度: ${password?.length || 0}`);

    // 验证必填字段
    if (!username || !password) {
      console.log('登录失败: 用户名或密码为空');
      return NextResponse.json(
        { error: '用户名和密码不能为空' },
        { status: 400 }
      );
    }

    // 查找用户
    let user;
    try {
      user = await UserModel.findByUsername(username);
      console.log('数据库用户查询结果:', user ? '用户存在' : '用户不存在');
    } catch (dbError) {
      console.error('查询数据库出错:', dbError);
      return NextResponse.json(
        { error: '数据库查询失败' },
        { status: 500 }
      );
    }

    if (!user) {
      console.log('登录失败: 用户不存在');
      return NextResponse.json(
        { error: '用户名或密码错误' },
        { status: 401 }
      );
    }

    // 验证密码
    try {
      const isPasswordValid = await comparePassword(password, user.password);
      console.log('密码验证结果:', isPasswordValid ? '密码正确' : '密码错误');

      if (!isPasswordValid) {
        console.log('登录失败: 密码错误');
        return NextResponse.json(
          { error: '用户名或密码错误' },
          { status: 401 }
        );
      }
    } catch (passwordError) {
      console.error('密码验证出错:', passwordError);
      return NextResponse.json(
        { error: '密码验证失败' },
        { status: 500 }
      );
    }

    // 生成JWT令牌
    let token;
    try {
      const payload = {
        id: user.id,
        username: user.username,
        timestamp: Date.now() // 添加时间戳以确保令牌唯一
      };
      console.log('准备生成JWT令牌，载荷:', payload);

      token = generateToken(payload);
      console.log('JWT令牌生成成功，令牌长度:', token.length);
      console.log('令牌前20个字符:', token.substring(0, 20) + '...');
    } catch (tokenError) {
      console.error('生成令牌出错:', tokenError);
      return NextResponse.json(
        { error: '生成令牌失败' },
        { status: 500 }
      );
    }

    // 提取用户信息（不包含密码）
    const { password: _, ...userInfo } = user;

    console.log('登录成功，用户ID:', userInfo.id);
    console.log('生成的token长度:', token.length);

    // 构建响应
    const responseData = {
      message: '登录成功',
      token,
      user: userInfo
    };

    console.log('响应数据:', JSON.stringify(responseData).substring(0, 100) + '...');

    // 设置响应头，确保浏览器不缓存响应
    const headers = new Headers();
    headers.append('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate');
    headers.append('Pragma', 'no-cache');
    headers.append('Expires', '0');
    headers.append('Surrogate-Control', 'no-store');
    headers.append('Content-Type', 'application/json');

    return NextResponse.json(responseData, {
      status: 200,
      headers
    });

  } catch (error) {
    console.error('登录处理过程中发生错误:', error);

    // 详细记录错误信息
    if (error instanceof Error) {
      console.error('错误类型:', error.constructor.name);
      console.error('错误消息:', error.message);
      console.error('错误堆栈:', error.stack);
    } else {
      console.error('未知错误类型:', typeof error);
      console.error('错误内容:', error);
    }

    // 设置响应头，确保浏览器不缓存响应
    const headers = new Headers();
    headers.append('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate');
    headers.append('Pragma', 'no-cache');
    headers.append('Content-Type', 'application/json');

    return NextResponse.json(
      {
        error: '服务器错误，请稍后再试',
        details: error instanceof Error ? error.message : '未知错误',
        timestamp: new Date().toISOString()
      },
      {
        status: 500,
        headers
      }
    );
  }
}